package com.briup.pts.config.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.util.StringUtils;

import java.util.function.Function;

/**
 * 统一的响应格式
 */
@Data
@Schema(description = "统一响应格式")
public class Result<T> {
    /**
     * 响应状态码，200表示成功，其它表示失败
     */
    @Schema(description = "响应状态码")
    private int code;
    /**
     * 响应的消息，包括但不限于成功的消息和失败的消息
     */
    @Schema(description = "响应消息")
    private String message;
    /**
     * 响应的数据，只有在成功时需要返回
     */
    @Schema(description = "响应数据")
    private T data;

    // 构造器私有化，即在外界不直接通过构造器创建对象
    private Result(int code, String message) {
        this(code, message, null);
    }

    private Result(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 默认的成功响应，不返回数据
     *
     * @return 成功的结果
     */
    public static <T> Result<T> success() {
        return new Result<>(200, "success");
    }

    /**
     * 返回成功的响应，需要返回响应数据，
     * 同时保证响应消息自定义
     *
     * @param data 响应的数据
     * @return 成功的响应
     */
    public static <T> Function<String, Result<T>> success(T data) {
        return message ->
                new Result<>(200,
                        // 如果传入的消息有值，那么返回自定义消息，否则返回 success
                        StringUtils.hasText(message) ? message : "success"
                        , data);
    }


    /**
     * 默认的失败响应，服务器内部异常
     *
     * @return 失败的结果
     */
    public static Result<?> fail() {
        return new Result<>(500, "服务器内部异常");
    }

    public static Result<?> fail(String message) {
        return new Result<>(500, message);
    }

    public static Result<?> fail(int code, String message) {
        return new Result<>(code, message);
    }
}
